package com.example.werewolf.common;

import lombok.Getter;

/**
 * 游戏状态枚举
 */
@Getter
public enum GameStatus {

    /**
     * 未初始化游戏
     * - 游戏尚未创建或未开始准备
     */
    NOT_INITIALIZED(0, "未初始化", "游戏尚未开始准备"),

    /**
     * 初始化游戏中
     * - 正在创建房间、分配角色、等待玩家就绪等准备阶段
     */
    INITIALIZING(1, "初始化中", "正在准备游戏，分配角色..."),

    /**
     * 对局进行中
     * - 游戏已正式开始，玩家正在进行回合操作
     */
    IN_PROGRESS(2, "对局进行中", "游戏正在进行中"),

    /**
     * 对局结束
     * - 游戏正常结束（如狼人被全部淘汰 或 村民被全部淘汰）
     */
    FINISHED(3, "对局结束", "游戏已正常结束"),

    /**
     * 对局异常
     * - 因玩家退出、网络中断、系统错误等导致游戏中断
     */
    ABNORMAL(4, "对局异常", "游戏因异常情况中断");

    /**
     * 状态码（可用于数据库存储）
     */
    private final int code;

    /**
     * 简短状态名称（用于前端显示）
     */
    private final String name;

    /**
     * 详细描述（用于日志或提示）
     */
    private final String description;

    GameStatus(int code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    // ============ 工具方法 ============

    /**
     * 根据状态码获取枚举
     */
    public static GameStatus fromCode(int code) {
        for (GameStatus status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("无效的游戏状态码: " + code);
    }

    /**
     * 判断是否为“游戏中”状态（包括初始化和进行中）
     */
    public boolean isGaming() {
        return this == INITIALIZING || this == IN_PROGRESS;
    }

    /**
     * 判断是否为“已结束”状态（包括正常结束和异常）
     */
    public boolean isEnded() {
        return this == FINISHED || this == ABNORMAL;
    }

    /**
     * 判断是否可以开始新游戏（只有未初始化或已结束时才能开始）
     */
    public boolean canStartNewGame() {
        return this == NOT_INITIALIZED || this.isEnded();
    }
}